package com.free.utils;

import com.free.utils.crypt.DESCrypt;
import com.free.utils.crypt.MD5Crypt;
import com.free.utils.crypt.RSACrypt;
import com.free.utils.crypt.SHACrypt;
import org.apache.commons.lang3.StringUtils;

/**
 * <p>
 * 功能概述: 
 * </p>
 * <p>
 * 功能详述: 
 * </p>
 */
public class CryptUtils
{

    /*========================================================================*
     *                         Public Fields (公共属性)                                                                
     *========================================================================*/

    /**
     * 对数据库数据进行 DES 加密解密时使用的 key
     */
    private static final String DES_ENCRYPT_KEY ="litianping";
 
    /**
     * 对数据库数据进行 RSA 加密用 exponent
     */
    private static final String RSA_ENCRYPT_EXPONENT ="AQAB";

    /**
     * 对数据库数据进行 RSA 加密用公钥
     */
    private static final String RSA_ENCRYPT_PUBLIC_KEY ="vN06qEvqgEZBJY7lPKLJmryHz1oqajvQDadlRvkfZGnTtVjLfP9lpsZsiJr+2+uSZraT5kGzwTfHEuXkl8GVer3mXh+znYW+TItkL6Ae/2XAOhAR/d8AC+HvuuHCZwjBNgY6WJo34xcoJuG2NB+8a1VkWYmKX2L3lFXnzaIfhlM=";

    /**
     * 对数据库数据进行 RSA 解密用私钥
     */
    private static final String RSA_DECRYPT_PRIVATE_KEY ="vN06qEvqgEZBJY7lPKLJmryHz1oqajvQDadlRvkfZGnTtVjLfP9lpsZsiJr+2+uSZraT5kGzwTfHEuXkl8GVer3mXh+znYW+TItkL6Ae/2XAOhAR/d8AC+HvuuHCZwjBNgY6WJo34xcoJuG2NB+8a1VkWYmKX2L3lFXnzaIfhlM=";

    /**
     * 对数据库数据进行 RSA 解密用 exponent
     */
    private static final String RSA_DECRYPT_EXPONENT ="D0j4TlaWi/sjmp6N/vJNzrAjbaymciKVHAXINI5E9CN8dtjQ3zTsTSsR7Zxds/7EwntUTPZUTfbtraHddkq8hibj8N+bC4Q4hXm1TUoI42257LWQzuIo4/apDkvZYopFEz4t+7Jfl640TKh/jgbwjskDSYfWRF0uMm0RUproz0E=";

    /**
     * 对数据库数据进行 RSA 解密用字符编码
     */
    private static final String UTF_16LE ="UTF-16LE";
    
    /**
     * 对数据库交易密码进行 MD5 加密时用的 key
     */
    private static final String MD5_PASSWORD_KEY ="1234567890qwertyuiopasdfghjklzxc";

    /*========================================================================*
     *                         Private Fields (私有属性)                                                                
     *========================================================================*/

    /*========================================================================*
     *                         Construct Methods (构造方法) 
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)                                                                   
     *========================================================================*/
    
    /**
     * 对指定字符进行 DES 加密（主要用于加密数据库中数据）
     * @param data
     * @return
     */
    public static String getDesEncryptedData(String data)
    {
        return DESCrypt.encrypt(data, DES_ENCRYPT_KEY);
    }
    
    /**
     * 对指定的 DES 加密后字符进行解密（主要用于解密数据库中数据）
     * @param encryptedData
     * @return
     */
    public static String getDesDecryptedData(String encryptedData)
    {
        return DESCrypt.decrypt(encryptedData, DES_ENCRYPT_KEY);
    }
    
    /**
     * 对指定的 RSA 加密后的字符进行解密（主要用于解密数据库中数据）
     * @param encryptedData
     * @return
     */
    public static String getRsaDecryptedData(String encryptedData)
    {
        if(StringUtils.isEmpty(encryptedData))
        {
            return encryptedData;
        }
        
        return RSACrypt.decryptByModuluString(encryptedData, RSA_DECRYPT_PRIVATE_KEY, RSA_DECRYPT_EXPONENT, UTF_16LE);
    }
    
    /**
     * 对指定的字符进行 RSA 加密（主要用于加密数据库中数据）
     * @param data
     * @return
     */
    public static String getRsaEncryptedData(String data)
    {
        return RSACrypt.encryptByModuluString(data, RSA_ENCRYPT_PUBLIC_KEY, RSA_ENCRYPT_EXPONENT, UTF_16LE);
    }

    public static String getSha1EncryptedData(String data){
        return SHACrypt.sha1Hex(data);
    }

    /**
     * 对指定字符串进行 MD5 加密处理（主要用于交易密码）
     * @param data
     * @return 16进制形式字符串
     */
    public static String getMD5EncryptedData(String data)
    {
        return MD5Crypt.sign(data, MD5_PASSWORD_KEY);
    }
    
    /*========================================================================*
     *                         Private Methods (私有方法)                                                                   
     *========================================================================*/

    public static void main(String[] args) {
        System.out.println(CryptUtils.getDesDecryptedData("0F91065405CB0B0CFC8835CFAD4055EB9409A5AAD84FDDC5"));
        System.out.println(CryptUtils.getDesDecryptedData("75AAF528E1573D0CF0155E38A87EA74D"));
    }
}

